#ifndef SYSTEM_PARAM_H
#define SYSTEM_PARAM_H
#include "cot_param.h"

/**
 * @brief 十六进制数据打印宏
 * @param str 打印标识字符串
 * @param hex 待打印的十六进制数据
 * @param len 数据长度
 */
#define HEX_PRINTF(str, hex, len)     \
    printf("%s: [%d] -> ", str, len); \
    for (int i = 0; i < (len); i++)   \
    {                                 \
        printf("%02x ", hex[i]);      \
    }                                 \
    printf("\n");

/**
 * @brief 参数演示结构体
 * @details 包含了各种类型的参数用于演示参数管理框架的功能
 */
typedef struct
{
    uint16_t usValue;    /* 无符号16位整型参数 */
    uint8_t ucValue;     /* 无符号8位整型参数 */
    uint32_t uiValue;    /* 无符号32位整型参数 */
    float fValue;        /* 单精度浮点型参数 */
    char szString_1[12]; /* 字符串参数1 */
    double dValue;       /* 双精度浮点型参数 */
    int16_t sValue;      /* 有符号16位整型参数 */
    int8_t cValue;       /* 有符号8位整型参数 */
    int32_t iValue;      /* 有符号32位整型参数 */
    char szString_2[10]; /* 字符串参数2 */
} ParamDemo_t;

/* 全局测试参数实例 */
extern ParamDemo_t g_tTestVal; /* 参数演示结构体实例 */
extern int8_t g_cTest;         /* 全局测试参数1 */
extern char g_szString[10];    /* 全局测试参数2 */

/* 参数管理函数 */
void InitParam(bool isReset);   /* 初始化参数管理器，isReset:是否重置参数 */
void ReloadParam(bool isReset); /* 从存储设备重新加载参数，isReset:是否在加载前进行参数校验 */
void SaveParam(bool isReset);   /* 保存参数到存储设备，isReset:是否在保存前进行参数校验 */
void ResetParam(void);          /* 重置所有参数为默认值 */

int SingleParamCheckProcess(const void *pCurParam, cotParamResetOpt_e eResetOpt);    /* 单个参数校验处理，返回0成功 */
cotParamCheckRet_e SingleParamCheck(const void *pCurParam, const void *pCheckValue); /* 检查单个参数值是否合法 */
cotParamCheckRet_e SingleParamSelfCheck(const void *pCurParam);                      /* 单个参数自检 */
void SingleParamResetResetDefValue(const void *pCurParam);                           /* 重置单个参数为默认值 */
void SingleParamChange(const void *pCurParam, ...);                                  /* 修改单个参数值 */
void ShowAllParam(void);                                                             /* 显示所有参数信息 */

int SaveSingleParamByAddr(const void *pParam); /* 通过参数地址保存单个参数，返回0成功 */
int SaveSingleParamById(uint16_t id);          /* 通过参数ID保存单个参数，返回0成功 */
int LoadSingleParamByAddr(const void *pParam); /* 通过参数地址加载单个参数，返回0成功 */
int LoadSingleParamById(uint16_t id);          /* 通过参数ID加载单个参数，返回0成功 */

/* 测试函数 */
void TestSaveSingleParamById(void);
void TestSaveSingleParamByAddr(void);
void ParamSaveTestExample(void);

#endif /* SYSTEM_PARAM_H */
